package net.cyl.component;

import com.google.common.hash.Hashing;
import net.cyl.strategy.ShardingDBConfig;
import net.cyl.strategy.ShardingTableConfig;
import net.cyl.util.CommonUtil;
import org.springframework.stereotype.Component;

/**
 * ShortLinkComponent类用于生成短链接代码
 */
@Component
public class ShortLinkComponent {

    /**
     * 包含所有可能的字符和数字，用于生成短链接代码
     */
    private static final String ALL_CHAR_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    /**
     * 创建短链接代码
     *
     * @param url 原始URL
     * @return 生成的短链接代码
     */
    public String createShortLinkCode(String url) {
        // 使用MurmurHash算法对URL进行哈希
        long murmurHash = CommonUtil.murmurHash32(url);

        // 将哈希值转换为62进制的字符串，并组合数据库和数据表的前缀
        return ShardingDBConfig.getRandomDBPrefix(decimalToBase62(murmurHash)) + decimalToBase62(murmurHash)+ ShardingTableConfig.getRandomTablePrefix(decimalToBase62(murmurHash));
    }

    /**
     * 将十进制数字转换为62进制的字符串
     *
     * @param decimal 十进制数字
     * @return 62进制的字符串
     */
    public String decimalToBase62(long decimal) {
        StringBuilder base62 = new StringBuilder();
        while (decimal > 0) {
            // 求十进制数除以62的余数，并对应到62进制的字符
            int remainder = (int) (decimal % 62);
            base62.insert(0, ALL_CHAR_NUM.charAt(remainder));
            // 十进制数除以62，继续下一轮循环
            decimal = decimal / 62;
        }
        return base62.toString();
    }
}
